﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;

namespace TMS
{
    public class ComentarioErrorXMLManager : XMLBaseManager
    {
         private static ComentarioErrorXMLManager _instancia;
        public static ComentarioErrorXMLManager getInstancia()
        {
            if (_instancia == null)
            {
                _instancia = new ComentarioErrorXMLManager();
            }
            return _instancia;
        }
        private ComentarioErrorXMLManager()
        {
            nombreRoot = "Comentarios";
            nombreArchivo = nombreRoot + ".xml";
        }

        public void addComentario(ComentarioError pComentario, long pIdError)
        {
            XDocument xDoc = loadDoc(); //Carga el documento.
            XElement comentarios = xDoc.Root; //Obtiene la raiz del documento XML.
            XElement com = new XElement("Comentario");
            com.SetAttributeValue("Id", pComentario.Id);
            com.SetAttributeValue("IdError", pIdError);
            com.SetElementValue("Texto", pComentario.Comentario);
            com.SetElementValue("Fecha", pComentario.Fecha.ToString());
            com.SetElementValue("IdUsuario", pComentario.Usuario.NroUsuario);
            comentarios.Add(com);
            saveDoc(xDoc);
        }
        public void updateComentario(ComentarioError pComentario, long pIdError)
        {
            XDocument xDoc = loadDoc();
            XElement com = xDoc.Root.Elements().Single(e => long.Parse(e.Attribute("Id").Value) == pComentario.Id);
            com.SetAttributeValue("IdError", pIdError);
            com.SetElementValue("Texto", pComentario.Comentario);
            /*com.SetElementValue("Fecha", pComentario.Fecha.ToString());
            com.SetElementValue("IdUsuario", pComentario.Usuario.NroUsuario);*/
            saveDoc(xDoc);
        }
        public void removeComentsByIdError(long pIdError)
        {
            /*
             * Elimina todos los comentarios que pertenezcan al error cuyo Id se recibe como parametro.
             */ 
            XDocument xDoc = loadDoc();
            foreach (XElement xe in xDoc.Root.Elements().Where(d => long.Parse(d.Attribute("IdError").Value) == pIdError))
            { 
               xe.Remove(); 
            }
            saveDoc(xDoc);
        }
        public List<ComentarioError> getComentariosByIdError(long pIdError)
        {
            /*
             * Devuelve una lista con los comentarios pertenecientes al error cuyo Id se recibe como parametro.
             */ 
            List<ComentarioError> lstComments = new List<ComentarioError>();
            XDocument xDoc = loadDoc();
            /*
             * Realiza iteraciones dentro de la lista generada con todos los comentarios cuyo atributo "IdError"
             * sea igual al recibido como parametro.
             */
            try
            {
                foreach (XElement xe in xDoc.Root.Elements().Where(d => long.Parse(d.Attribute("IdError").Value) == pIdError))
                {
                    ComentarioError c = new ComentarioError(); //En cada iteracion crea una nueva instancia de ComentarioError y la agrega a la lista.
                    c.Id = long.Parse(xe.Attribute("Id").Value);
                    c.Comentario = xe.Element("Texto").Value;
                    c.Fecha = DateTime.Parse(xe.Element("Fecha").Value);
                    c.Usuario = UsuarioXMLManager.getInstancia().getUsuarioById(long.Parse(xe.Element("IdUsuario").Value));
                    lstComments.Add(c);
                }
            }
            catch (InvalidOperationException)
            { }
            return lstComments;
        }
        public ComentarioError getCommentById(long comId)
        {
            ComentarioError ce = null;
            if (comId > 1) //Si el Id de comentario que se recibe como parametro es mayor a 1....
            {
                XDocument xDoc = loadDoc();
                XElement com = xDoc.Root.Elements().Single(e => long.Parse(e.Attribute("Id").Value) == comId);
                ce = new ComentarioError();
                ce.Id = comId;
                ce.Comentario = "" + com.Element("Texto").Value;
                ce.Fecha = DateTime.Parse(com.Element("Fecha").Value);
                ce.Usuario = UsuarioXMLManager.getInstancia().getUsuarioById(long.Parse(com.Element("IdUsuario").Value));
            }
            return ce;
        }
    }
}